const Koa = require("koa");
const app = new Koa();
const { connect, initSchema } = require("./dataBase/init");
// const bodyParser = require("koa-bodyparser");
const cors = require("koa2-cors");
const koajwt = require("koa-jwt");
const koaBody = require("koa-body");
const static = require('koa-static')   //静态资源服务插件
const path = require('path')           //路径管理

// app.use(bodyParser());
app.use(cors());

app.use(
  koaBody({
    multipart: true,
    formidable: {
      maxFileSize: 200 * 1024 * 1024 // 设置上传文件大小最大限制，默认2M
    }
  })
);

// 配置静态资源
const staticPath = './static'
app.use(static(
    path.join( __dirname, staticPath)
));

(async () => {
  await connect();
  initSchema(); // 引入数据模型 schema
})();

// token 错误处理
app.use((ctx, next) => {
  return next().catch(err => {
    if (err.status === 401) {
      ctx.status = 401;
      ctx.body = {
        code: 401,
        message: "token过期"
      };
    } else {
      throw err;
    }
  });
});

// 除了指定的路由外 其它路由请求都要验证token
app.use(
  koajwt({
    secret: "my_token"
  }).unless({
    path: [
      /\/user\/login/, // 登录
      /\/user\/register/, // 注册
      /\/goods\/getDetailGoodsInfo/, // 商品详情
      /\/goods\/getGoodsInfoByKeyWord/, // 搜索商品
      /\/goods\/categoryList/, // 商品大类信息
      /\/goods\/categorySubList/, // 商品小类信息
      /\/goods\/getGoodsListByCategorySubId/, // 通过 id 获取小类商品
      /\/goods\/getComment/, // 获取商品评论
      /\/goods\/postkeyword/, // 提交搜索词
      /\/goods\/gethotword/, // 提交搜索词
      /\/goods\/deleteCart/, // 删除历史订单
      /\/goods\/main/, // 首页信息
    ]
    // path: [/\/user\/login/, /\/user\/register/]
  })
);

const Router = require("koa-router");
// 引入 用户路由
let user = require("./appAPI/user.js");
let goods = require("./appAPI/goods.js");

// 装载所有子路由
let router = new Router();
router.use("/user", user.routes());
router.use("/goods", goods.routes());

// 加载路由中间件
app.use(router.routes());
app.use(router.allowedMethods());

app.use(async ctx => {
  ctx.body = "<h1>hello </h1>";
});

app.listen(3000, () => {
  console.log("service starting at port 3000");
});
